import { defineStore } from "pinia";
import { reactive, computed, watch } from "vue";

/**
 * 订单管理Store
 * 负责管理订单相关的状态，包括临时支付列表、待支付订单、已完成订单等
 */
export const useOrderStore = defineStore("order", () => {
  
  // ==========================================
  // 状态变量 (State)
  // ==========================================
  
  /** 
   * 临时支付列表 - 用于payment界面展示待支付商品
   * @type {Array} 商品对象数组
   */
  const tempPaymentList = reactive([]);
  
  /** 
   * 已完成的订单列表 
   * @type {Array} 订单对象数组
   */
  const finishedOrderList = reactive([]);
  
  /** 
   * 待支付的订单列表
   * @type {Array} 订单对象数组 
   */
  const pendingPaymentList = reactive([]);

  // ==========================================
  // 计算属性 (Getters)
  // ==========================================
  
  /** 
   * 全部订单列表 - 合并已完成和待支付订单
   * @returns {Array} 所有订单的合并数组
   */
  const allOrderList = computed(() => {
    return [...finishedOrderList, ...pendingPaymentList];
  });
  
  /** 
   * 待支付订单数量
   * @returns {Number} 待支付订单的数量
   */
  const pendingPaymentListCount = computed(() => {
    return pendingPaymentList.length;
  });
  
  /** 
   * 已完成订单数量
   * @returns {Number} 已完成订单的数量
   */
  const finishedOrderListCount = computed(() => {
    return finishedOrderList.length;
  });
  
  /** 
   * 全部订单数量
   * @returns {Number} 所有订单的总数量
   */
  const allOrderListCount = computed(() => {
    return allOrderList.value.length;
  });
  
  /** 
   * 支付页总价计算 (单位: 分)
   * 将tempPaymentList中所有商品的价格乘以数量后累加，并乘以100转换为分
   * @returns {Number} 总价(分)
   */
  const totalPrice = computed(() => {
    return tempPaymentList.reduce((sum, item) => {
      return sum + (item.price * item.num);
    }, 0) * 100;
  });

  // ==========================================
  // 方法 (Actions)
  // ==========================================
  
  /**
   * 配送时间转换函数
   * 将分钟转换为更易读的格式(如: 90分钟 -> 1小时30分钟)
   * @param {Number} minute - 配送时间(分钟)
   * @returns {String} 格式化后的时间字符串
   * @example 
   * transformDeliveryTime(0) // "0分钟"
   * transformDeliveryTime(30) // "30分钟" 
   * transformDeliveryTime(90) // "1小时30分钟"
   * transformDeliveryTime(120) // "2小时"
   */
  const transformDeliveryTime = (minute) => {
    if (minute === 0) return '0分钟';
    
    const hours = Math.floor(minute / 60);
    const remainingMinutes = minute % 60;
    
    if (hours === 0) {
      return `${remainingMinutes}分钟`;
    } else if (remainingMinutes === 0) {
      return `${hours}小时`;
    } else {
      return `${hours}小时${remainingMinutes}分钟`;
    }
  };

  /**
   * 更新订单确认状态
   * 根据订单ID在对应的订单列表中更新确认状态
   * @param {Object} order - 订单对象
   * @param {Boolean} isConfirmed - 确认状态
   */
  const updateOrderConfirmed = (order, isConfirmed) => {
    if (!order || !order.id) {
      console.error('无效的订单对象:', order);
      return;
    }

    // 在待支付列表中查找并更新
    const pendingIndex = pendingPaymentList.findIndex(item => item.id === order.id);
    if (pendingIndex !== -1) {
      pendingPaymentList[pendingIndex].isConfirmed = isConfirmed;
      console.log(`待支付订单 ${order.id} 确认状态已更新为:`, isConfirmed);
      return;
    }

    // 在已完成列表中查找并更新
    const finishedIndex = finishedOrderList.findIndex(item => item.id === order.id);
    if (finishedIndex !== -1) {
      finishedOrderList[finishedIndex].isConfirmed = isConfirmed;
      console.log(`已完成订单 ${order.id} 确认状态已更新为:`, isConfirmed);
      return;
    }

    console.warn(`未找到订单 ${order.id}`);
  };

  /**
   * 根据订单ID删除订单
   * @param {String} orderId - 订单ID
   */
  const removeOrderById = (orderId) => {
    if (!orderId) {
      console.error('无效的订单ID:', orderId);
      return;
    }

    // 在待支付列表中查找并删除
    const pendingIndex = pendingPaymentList.findIndex(item => item.id === orderId);
    if (pendingIndex !== -1) {
      pendingPaymentList.splice(pendingIndex, 1);
      console.log(`已从待支付列表删除订单 ${orderId}`);
      return;
    }

    // 在已完成列表中查找并删除
    const finishedIndex = finishedOrderList.findIndex(item => item.id === orderId);
    if (finishedIndex !== -1) {
      finishedOrderList.splice(finishedIndex, 1);
      console.log(`已从已完成列表删除订单 ${orderId}`);
      return;
    }

    console.warn(`未找到订单 ${orderId}`);
  };

  /**
   * 完成支付，将临时支付列表中的订单转移到已完成列表
   */
  const completePayment = () => {
    if (tempPaymentList.length === 0) {
      console.warn('临时支付列表为空，无需完成支付');
      return;
    }

    // 将临时支付列表中的订单添加到已完成列表
    tempPaymentList.forEach(item => {
      // 设置订单为已支付状态
      item.isPaid = true;
      // 设置支付时间
      item.paidTime = new Date().toISOString();
      // 添加到已完成列表
      finishedOrderList.push(item);
    });

    console.log(`支付完成，已将 ${tempPaymentList.length} 个订单转移到已完成列表`);
    
    // 清空临时支付列表
    tempPaymentList.splice(0, tempPaymentList.length);
  };

  // ==========================================
  // 监听器 (Watchers)
  // ==========================================
  
  /**
   * 监听待支付订单列表变化
   * 当有新订单添加到待支付列表时，自动设置订单状态
   * - isConfirmed: false (订单未确认)
   * - isPaid: false (订单未支付)
   */
  watch(pendingPaymentList, (newList, oldList) => {
    // 只对新添加的订单设置默认状态
    newList.forEach((item, index) => {
      // 如果是新添加的订单（旧列表中不存在）
      if (!oldList || !oldList[index] || oldList[index].id !== item.id) {
        if (item.isConfirmed === undefined) {
          item.isConfirmed = false;
        }
        if (item.isPaid === undefined) {
          item.isPaid = false;
        }
      }
    });
  }, { deep: true });
  
  /**
   * 监听已完成订单列表变化
   * 当订单标记为已完成时，自动设置支付状态
   * - isPaid: true (订单已支付)
   */
  watch(finishedOrderList, (newList, oldList) => {
    // 只对新添加的订单设置默认状态
    newList.forEach((item, index) => {
      // 如果是新添加的订单（旧列表中不存在）
      if (!oldList || !oldList[index] || oldList[index].id !== item.id) {
        if (item.isPaid === undefined) {
          item.isPaid = true;
        }
      }
    });
  }, { deep: true });

  // ==========================================
  // 导出 (Return)
  // ==========================================
  
  return {
    // 状态变量
    tempPaymentList,
    finishedOrderList, 
    pendingPaymentList,
    
    // 计算属性
    allOrderList,
    pendingPaymentListCount,
    finishedOrderListCount,
    allOrderListCount,
    totalPrice,
    
    // 方法
    transformDeliveryTime,
    updateOrderConfirmed,
    removeOrderById,
    completePayment
  };

});
